home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Mail / pine3.92 / pico / os2spell.c < prev    next >
C/C++ Source or Header  |  1996-03-14  |  3KB  |  130 lines

  1. #if    !defined(lint) && !defined(DOS)
  2. static char rcsid[] = "$Id: os2spell.c,v 4.2 1996/03/15 07:43:51 hubert Exp $";
  3. #endif
  4. /*
  5.  * Pine and Pico are registered trademarks of the University of Washington.
  6.  * No commercial use of these trademarks may be made without prior written
  7.  * permission of the University of Washington.
  8.  * 
  9.  * Pine, Pico, and Pilot software and its included text are Copyright
  10.  * 1989-1996 by the University of Washington.
  11.  * 
  12.  * The full text of our legal notices is contained in the file called
  13.  * CPYRIGHT, included with this distribution.
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include "osdep.h"
  18. #include "estruct.h"
  19. #ifdef    SPELLER
  20. #include "pico.h"
  21. #include "edef.h"
  22.  
  23. /*
  24.  * spell - fork off an spell checker
  25.  * this is different for OS/2 with ispell; here, the document
  26.  * correction and interface is provided by ispell itself
  27.  */
  28. #define MAXARGS 10
  29. spell(f, n)
  30. {
  31.   char   sp[NLINE];                /* buf holding spell command */
  32.   char   *fn;                    /* tmp holder for file name */
  33.   char   *cp;
  34.   char   *args[MAXARGS];            /* ptrs into edit command */
  35.   char   *writetmp();
  36.   int    child, pid, i, done = 0;
  37.   long   l;
  38.   int    stat;
  39.   FILE   *p;
  40.  
  41.   if(Pmaster == NULL)
  42.     return(-1);
  43.  
  44.   if((fn = writetmp(0, 0)) == NULL){
  45.     emlwrite("Can't write temp file for spell checker");
  46.     return(-1);
  47.   }
  48.   if((cp = (char *)getenv("SPELL")) == NULL)
  49.     cp = SPELLER;
  50.   strcpy(sp,cp);
  51.  
  52.   if((fn=writetmp(0, 1)) == NULL){        /* get temp file */
  53.     emlwrite("Problem writing temp file for alt editor", NULL);
  54.     return(-1);
  55.   }
  56.  
  57.   strcat(sp, " ");
  58.   strcat(sp, fn);
  59.  
  60.   cp = sp;
  61.   for(i=0; *cp != '\0';i++) {            /* build args array */
  62.     if(i < MAXARGS) {
  63.       args[i] = NULL;            /* in case we break out */
  64.     }
  65.     else{
  66.       emlwrite("Too many args for command!", NULL);
  67.       return(-1);
  68.     }
  69.  
  70.     while(isspace(*cp))
  71.       if(*cp != '\0')
  72.     cp++;
  73.       else break;
  74.  
  75.     args[i] = cp;
  76.     while(!isspace(*cp))
  77.       if(*cp != '\0')
  78.     cp++;
  79.       else
  80.     break;
  81.  
  82.     if(*cp != '\0')
  83.       *cp++ = '\0';
  84.   }
  85.  
  86.   args[i] = NULL;
  87.  
  88.   (*Pmaster->raw_io)(0);            /* turn OFF raw mode */
  89.  
  90.   emlwrite("Invoking spell checker...", NULL);
  91.  
  92.   if(child=fork()) {            /* wait for the child to finish */
  93.     void (*ohup)() = signal(SIGHUP, SIG_IGN);    /* ignore signals for now */
  94.     void (*oint)() = signal(SIGINT, SIG_IGN);
  95.  
  96.     while((pid=(int)wait(&stat)) != child)
  97.       ;
  98.  
  99.     signal(SIGHUP, ohup);    /* restore signals */
  100.     signal(SIGINT, oint);
  101.   }
  102.   else {                /* spawn editor */
  103.     signal(SIGHUP, SIG_DFL);    /* let editor handle signals */
  104.     signal(SIGINT, SIG_DFL);
  105.     if(execvp(args[0], args) < 0)
  106.       exit(1);
  107.   }
  108.  
  109.   (*Pmaster->raw_io)(1);        /* turn ON raw mode */
  110.   dont_interrupt();
  111.  
  112.   /*
  113.    * replace edited text with new text 
  114.    */
  115.   curbp->b_flag &= ~BFCHG;        /* make sure old text gets blasted */
  116.   readin(fn, 0);            /* read new text overwriting old */
  117.   unlink(fn);                /* blast temp file */
  118.   curbp->b_flag |= BFCHG;        /* mark dirty for packbuf() */
  119.   ttopen();                /* reset the signals */
  120.   refresh(0, 1);            /* redraw */
  121.   return(0);
  122. }
  123.  
  124. #endif    /* SPELLER */
  125.  
  126.  
  127.  
  128.  
  129.  
  130.